/*        
	Copyright (C) 2010- Peer internet solutions

	Copyright (C) 2013 Pontificia Universidad Catolica del Peru
	contact: http://avatar.inf.pucp.edu.pe/realidad-aumentada/
	address contact: Av. Universitaria 1801, San Miguel, Lima-Peru.

	This file is part of UbicAR PUCP.
	
	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with This program.  If not, see <http://www.gnu.org/licenses/>.
*/
/*
	Modified by: Pedro Carrión Castagnola
	Pontificia Universidad Catolica del Peru
	Direccion de Informatica Academica

	Modified by: Alvaro Roger Agüero Sánchez, Rodolfo Javier Galvez Meza
	Pontificia Universidad Catolica del Peru
	Departamento de Ingeniería
*/

package org.grupoavatar.guiaubicua.mix.data;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.grupoavatar.guiaubicua.VInicial;
import org.grupoavatar.guiaubicua.auxiliares.Interaccion;
import org.grupoavatar.guiaubicua.auxiliares.InteraccionEmail;
import org.grupoavatar.guiaubicua.auxiliares.InteraccionProducto;
import org.grupoavatar.guiaubicua.auxiliares.InteraccionWeb;
import org.grupoavatar.guiaubicua.auxiliares.Red;
import org.grupoavatar.guiaubicua.auxiliares.Servicio;
import org.grupoavatar.guiaubicua.entidades.LugarMarker;
import org.grupoavatar.guiaubicua.mix.Marker;
import org.grupoavatar.guiaubicua.mix.data.DataSource.DATASOURCE;
/*
import org.grupoavatarpucp.guiaubicuapucp.MixView;
import org.grupoavatarpucp.guiaubicuapucp.POIMarker;*/
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.annotation.SuppressLint;
import android.util.Log;


public class Json extends DataHandler {

	public static final int MAX_JSON_OBJECTS=1000;
	
	public List<Marker> loadAllMarkers(JSONObject root) {
		JSONObject jo = null;
		JSONArray dataArray = null;
    	List<Marker> markers=new ArrayList<Marker>();

		try {
			if(root.has("results"))
				dataArray = root.getJSONArray("results");
			if (dataArray != null) {

				Log.i(VInicial.TAG, "processing JSON Data Array");
				int top = Math.min(MAX_JSON_OBJECTS, dataArray.length());

				for (int i = 0; i < top; i++) {					
					
					jo = dataArray.getJSONObject(i);
					Marker ma = null;
					//ma = processLugaresJSONObject(jo, markers);

					if(ma!=null)
						markers.add(ma);
				}
			}
		}
		catch (JSONException e) {
			e.printStackTrace();
		}
		return markers;
	}
	
	@SuppressLint("DefaultLocale")
	/*
	public Marker processLugaresJSONObject(JSONObject jo, List<Marker> markers) throws JSONException {
		Marker ma = null;
//		parametros obligatorios:
		
		if (jo.has("title") && jo.has("lat") && jo.has("lng") && jo.has("id") && jo.has("id_categoria") ) {
			
			Log.v(VInicial.TAG, "processing Lugar JSON object");		
			String id_categoria = unescapeHTML(jo.getString("id_categoria"), 0);
			
			ArrayList<String> poiIdHijos = null;			
			JSONArray jarrHijos = null;
			if(jo.has("hijos"))	{
				try {
					poiIdHijos = new ArrayList<String>();
					jarrHijos = jo.getJSONArray("hijos");
					if (jarrHijos != null )	{
						int top = jarrHijos.length();
						for (int i = 0; i < top; i++) {	
							poiIdHijos.add(String.valueOf(jarrHijos.getInt(i)));						
						}
					}
				} catch (JSONException e) {
					e.printStackTrace();
				}
			}

			ArrayList<String> urlImgs = null;
			JSONArray jarrImgs = null;
			if(jo.has("url_images"))	{
				try {
					urlImgs = new ArrayList<String>();
					jarrImgs = jo.getJSONArray("url_images");
					if (jarrImgs != null )	{
						int top = jarrImgs.length();
						for (int i = 0; i < top; i++) {	
							JSONObject objImg = jarrImgs.getJSONObject(i);
							urlImgs.add(objImg.getString("url"));
						}
					}
				} catch (JSONException e) {
					e.printStackTrace();
				}
			}
			
			ArrayList<String> fechas = null;
			JSONArray jarrFechas = null;
			if(jo.has("fecha"))	{
				try {
					fechas = new ArrayList<String>();
					jarrFechas = jo.getJSONArray("fecha");
					if (jarrFechas != null )	{
						int top = jarrFechas.length();
						for (int i = 0; i < top; i++) {	
							JSONObject obj = jarrFechas.getJSONObject(i);
							fechas.add(obj.getString("fecha"));
						}
					} 
				} catch (JSONException e) {
					e.printStackTrace();
				}
			}
			
			
			ArrayList<String> enlaces = null;
			JSONArray jarrEnlaces = null;
			if(jo.has("enlace"))	{
				try {
					enlaces = new ArrayList<String>();
					jarrEnlaces = jo.getJSONArray("enlace");
					if (jarrEnlaces != null )	{
						int top = jarrEnlaces.length();
						for (int i = 0; i < top; i++) {	
							JSONObject obj = jarrEnlaces.getJSONObject(i);
							enlaces.add(obj.getString("enlace"));
						}
					}
				} catch (JSONException e) {
					e.printStackTrace();
				}
			}
			
			ArrayList<Red> redes = null;
			JSONArray jarrRedes = null;
			if(jo.has("redes"))	{
				try {
					redes = new ArrayList<Red>();
					jarrRedes = jo.getJSONArray("redes");
					if (jarrRedes != null )	{
						int top = jarrRedes.length();
						for (int i = 0; i < top; i++) {	
							JSONObject obj = jarrRedes.getJSONObject(i);
							Red r = new Red(obj.getString("red"),obj.getString("url"));
							redes.add(r);
						}
					} 
				}catch (JSONException e) {
					e.printStackTrace();
				}
				
			}
			
			ArrayList<Servicio> servicios = null;
			JSONArray jarrServicios = null;
			if (jo.has("servicios")) {
				try {
					servicios = new ArrayList<Servicio>();
					jarrServicios = jo.getJSONArray("servicios");
					if (jarrServicios != null )	{
						int top = jarrServicios.length();
						for (int i = 0; i < top; i++) {	
							JSONObject obj = jarrServicios.getJSONObject(i);
							int idInteraccion;
							char tipoInteraccion=0;
							try {
								idInteraccion = obj.getInt("interaccion");
								
								//codigo de prueba
								if (i == 0)
									tipoInteraccion = Interaccion.EMAIL;
								else
									tipoInteraccion = Interaccion.WEB;
								//fin codigo de prueba
								
								
//								tipoInteraccion = obj.getString("tipoInteraccion").charAt(0);
							} catch (Exception e) {
								idInteraccion = 0;
								tipoInteraccion = 0;
							}
							Servicio s = new Servicio(Servicios.obtenerDatasourceSegunId(obj.getString("id")),obj.getString("detalle"), idInteraccion, tipoInteraccion);
							servicios.add(s);
						}
					} 
				}catch (JSONException e) {
					e.printStackTrace();
				}
			}
			
			ArrayList<String> tags = null;			
			JSONArray jarrTags = null;
			if(jo.has("tags"))	{
				try {
					tags = new ArrayList<String>();
					jarrTags = jo.getJSONArray("tags");
					if (jarrTags != null )	{
						int top = jarrTags.length();
						for (int i = 0; i < top; i++) {	
							tags.add(jarrTags.getString(i).toLowerCase());						
						}
					}
				} catch (JSONException e) {
					e.printStackTrace();
				}
			}
			
			try {
				ma = new LugarMarker(
						jo.getString("id"), 
						unescapeHTML(jo.getString("title"), 0), 
						jo.getDouble("lat"), 
						jo.getDouble("lng"), 
						jo.getDouble("elevation"), 
						getDataSource(id_categoria),
						jo.getString("id_punto_padre"),
						jo.getString("descripcion"),
						jo.getString("desc_corta"),
						jo.getString("contacto"),
						jo.getString("ubicacion"),
						jo.getInt("piso"),
						jo.getInt("pisos"),
						jo.getInt("estrellas"),		
						jo.getInt("icono"),						
						urlImgs,
						redes,
						enlaces,
						fechas, 
						poiIdHijos,
						servicios,
						tags
					);
				markers.add(ma);
			} catch(Exception e) {
				e.printStackTrace();
				try {
					String tmpId = jo.getString("id");
					System.out.println("Construccion de id <"+tmpId+"> fallido.");
				} catch(Exception e2) {
					e.printStackTrace();
					System.out.println("No se pudo crear el elemento número <" + (markers.size()+1) + ">. Saltando al siguiente.");
				}
			}
		}
		return null;		
		
	}
	*/
	
	public Encuesta processEncuesta(JSONObject jo) throws JSONException {
		
		Encuesta encuesta = null;
//		parametros obligatorios:
		Log.v(VInicial.TAG, "processing encuesta JSON object");		
		if (jo.has("idEncuesta") && jo.has("titulo") && jo.has("preguntas")) {
		
//			String strId = unescapeHTML(jo.getString("id_encuesta"), 0);
//			int id = Integer.valueOf(strId);
			int id = jo.getInt("idEncuesta");
		
			ArrayList<Pregunta> preguntas = null;
			JSONArray jarrPreguntas = null;
			if (jo.has("preguntas")) {
				try {
					preguntas = new ArrayList<Pregunta>();
					jarrPreguntas = jo.getJSONArray("preguntas");
					if (jarrPreguntas != null )	{
						int top = jarrPreguntas.length();
						for (int i = 0; i < top; i++) {	
							JSONObject obj = jarrPreguntas.getJSONObject(i);
							ArrayList<OpcionPregunta> opciones = null;
							JSONArray jarrOpciones = null;
							if (obj.has("opciones")) {
								try {
									opciones = new ArrayList<OpcionPregunta>();
									jarrOpciones = obj.getJSONArray("opciones");
									if (jarrOpciones != null) {
										int top2 = jarrOpciones.length();
										for (int j = 0; j < top2; j++) {
											JSONObject obj2 = jarrOpciones.getJSONObject(j);
											opciones.add(new OpcionPregunta(Integer.valueOf(obj2.getInt("id")), obj2.getString("opcion")));
										}
									}
								} catch (Exception e) {}
							}
							//falta agregar la lectura del tipo de pregunta
							if (!obj.getString("pregunta").equalsIgnoreCase("")) {
								if (opciones != null && !opciones.isEmpty()) {
									Pregunta s = new Pregunta(Integer.valueOf(obj.getInt("idPregunta")),obj.getString("pregunta"), opciones, obj.getInt("multiple"));
									if (opciones != null) {
										for (int p = 0; p < opciones.size(); p++) {
											opciones.get(p).setPregunta(s);
										}
									}
									preguntas.add(s);
								} else {
									System.out.println("Construccion de pregunta con id <" + obj.getInt("idPregunta") + "> fallido. No hay opciones.");
								}
							} else {
								System.out.println("Construccion de pregunta con id <" + obj.getInt("idPregunta") + "> fallido. Falta descripción de pregunta.");
							}
							
						}
					} 
				}catch (JSONException e) {
					e.printStackTrace();
				}
			}
			encuesta = new Encuesta(id,
									jo.getString("titulo"),
									jo.getString("descripcion"),
									jo.getString("fechaIni"),
									jo.getString("fechaFin"),
									preguntas);
		}
		return encuesta;		
	}
	
	public int processValidarUsuario(JSONObject jo) {
		int id = 0;
		if (jo.has("idUsuario")) {
			try {
			id = jo.getInt("idUsuario");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return id;		
	}
	
	public Interaccion processInteraccion(JSONObject jo, int id) {
		Interaccion interaccion = null;
		if (jo.has("tipoInteraccion")) {
			try {
				char tipo;
				tipo = jo.getString("tipoInteraccion").charAt(0);
				switch (tipo) {
					case Interaccion.WEB: 		interaccion = processInteraccionWeb(jo, id);
												break;
					case Interaccion.EMAIL:		interaccion = processInteraccionEmail(jo, id);
												break;
					case Interaccion.PRODUCTO:	interaccion = processInteraccionProducto(jo, id);
												break;
					default:					interaccion = null;
												break;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return interaccion;		
	}
	
	public InteraccionWeb processInteraccionWeb(JSONObject jo, int id) {
		InteraccionWeb interaccion = null;
		try {
			if (jo.has("interaccion")) {
				JSONObject jo2 = jo.getJSONObject("interaccion");
				if (jo2.has("url") ) {					
					interaccion = new InteraccionWeb(id, Interaccion.WEB, jo2.getString("url"));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return interaccion;
	}
	
	public InteraccionEmail processInteraccionEmail(JSONObject jo, int id) {
		InteraccionEmail interaccion = null;
		try {
			if (jo.has("interaccion")) { 
				JSONObject jo2 = jo.getJSONObject("interaccion");
				String email = "";
				String subject = "";
				String message = "";
				if (jo2.has("email")) {
					email = jo2.getString("email");
				}
				if (jo2.has("subject")) {
					subject = jo2.getString("subject");
				}
				if (jo2.has("message")) {
					message = jo2.getString("message");
				}
				
				interaccion = new InteraccionEmail(id, Interaccion.EMAIL, email, subject, message);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return interaccion;
	}
	
	public InteraccionProducto processInteraccionProducto(JSONObject jo, int id) {
		return null;
	}
	
	public ResultadoConsultaRating processRespuestaRating(JSONObject jo) throws JSONException {
		
		ResultadoConsultaRating resultado = new ResultadoConsultaRating();
//		parametros obligatorios:
		Log.v(VInicial.TAG, "processing rating JSON object");		
		if (jo.has("promedio")) {
			try {
				resultado.setPromedio(jo.getDouble("promedio"));
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		if (jo.has("numVotos")) {
			try {
				resultado.setNumeroVotos(jo.getInt("numVotos"));
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		if (jo.has("votoUsr")) {
			try {
				resultado.setVotoUsuario(jo.getInt("votoUsr"));
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		return resultado;		
	}
	
	
//	public List<Marker> load(JSONObject root, DATASOURCE datasource) {
//		JSONObject jo = null;
//		JSONArray dataArray = null;
//    	List<Marker> markers=new ArrayList<Marker>();
//
//		try {
//			// Twitter & own schema
//			if(root.has("results"))
//				dataArray = root.getJSONArray("results");
//			if (dataArray != null) {
//
//				Log.i(VInicial.TAG, "processing "+datasource+" JSON Data Array");
//				int top = Math.min(MAX_JSON_OBJECTS, dataArray.length());
//
//				for (int i = 0; i < top; i++) {					
//					
//					jo = dataArray.getJSONObject(i);
//					Marker ma = null;
//					ma = processLugaresJSONObject(jo, markers, datasource);
////					ma = processLugaresJSONObject_Guia_ubicua(jo, markers);
//					if(ma!=null)
//						markers.add(ma);
//				}
//			}
//		}
//		catch (JSONException e) {
//			e.printStackTrace();
//		}
//		return markers;
//	}
	
	/*//muy antiguo
	public Marker processLugaresJSONObject_Guia_ubicua(JSONObject jo, List<Marker> markers) throws JSONException {
		Marker ma = null;

		if (jo.has("title") && jo.has("lat") && jo.has("lng")
				&& jo.has("elevation")) {

			String id = "";
			if(jo.has("id"))
					id = jo.getString("id");
			
			Log.v(VInicial.TAG, "processing Lugar JSON object");
			String link=null;
	
			if(jo.has("has_detail_page") && jo.getInt("has_detail_page")!=0 && jo.has("webpage"))
				link=jo.getString("webpage");
			
			//ingresando codigo para asignar elementos del json
			String foto_miniatura = null;
			if (jo.has("foto_miniatura")) 
				foto_miniatura = jo.getString("foto_miniatura");
			
			String icono = null;
			if (jo.has("icono")) 
				icono = jo.getString("icono");
			
			String id_categoria = null;
			if (jo.has("id_categoria")) 
				id_categoria = jo.getString("id_categoria");
			
			String id_punto_padre = null;
			if (jo.has("id_punto_padre")) 
				id_punto_padre = jo.getString("id_punto_padre");
			
			String desc_corta = null;
			if (jo.has("desc_corta")) 
				desc_corta = jo.getString("desc_corta");
			
			String descripcion = null;
			if (jo.has("descripcion")) 
				descripcion = jo.getString("descripcion");
			
			String anexo = null;
			if (jo.has("anexo")) 
				anexo = jo.getString("anexo");
			
			String tipo_punto = null;
			if (jo.has("tipo_punto")) 
				tipo_punto = jo.getString("tipo_punto");
			
			String letra = null;
			if (jo.has("letra")) 
				letra = jo.getString("letra");
			
			ma = new LugarMarker(
					id,
					unescapeHTML(jo.getString("title"), 0), 
					jo.getDouble("lat"), 
					jo.getDouble("lng"), 
					jo.getDouble("elevation"), 
					link, foto_miniatura,
					icono,id_categoria,
					id_punto_padre,desc_corta, 
					descripcion, anexo, 
					tipo_punto, letra,
					getDataSource(id_categoria));				
			markers.add(ma);
		}
		return null;
	}
	*/
	
//antiguo, usa datasource.
//	public Marker processLugaresJSONObject(JSONObject jo, List<Marker> markers, DATASOURCE datasource) throws JSONException {
//		Marker ma = null;
////		parametros obligatorios:
//		
//		if (jo.has("title") && jo.has("lat") && jo.has("lng") && jo.has("id") && jo.has("id_categoria") ) {
//			
//			Log.v(VInicial.TAG, "processing Lugar JSON object");		
//			String id_categoria = unescapeHTML(jo.getString("id_categoria"), 0);
//			
//			if (datasource == DataSource.obtenerDatasourceSegunId(id_categoria)) {
//				ArrayList<String> poiIdHijos = null;			
//				JSONArray jarrHijos = null;
//				if(jo.has("hijos"))	{
//					try {
//						poiIdHijos = new ArrayList<String>();
//						jarrHijos = jo.getJSONArray("hijos");
//						if (jarrHijos != null )	{
//							int top = jarrHijos.length();
//							for (int i = 0; i < top; i++) {	
//								JSONObject objHijo = jarrHijos.getJSONObject(i);
//								poiIdHijos.add(objHijo.getString("id_poi"));						
//							}
//						}
//					} catch (JSONException e) {
//						e.printStackTrace();
//					}
//				}
//	
//				ArrayList<String> urlImgs = null;
//				JSONArray jarrImgs = null;
//				if(jo.has("url_images"))	{
//					try {
//						urlImgs = new ArrayList<String>();
//						jarrImgs = jo.getJSONArray("url_images");
//						if (jarrImgs != null )	{
//							int top = jarrImgs.length();
//							for (int i = 0; i < top; i++) {	
//								JSONObject objImg = jarrImgs.getJSONObject(i);
//								urlImgs.add(objImg.getString("url"));
//							}
//						}
//					} catch (JSONException e) {
//						e.printStackTrace();
//					}
//				}
//				
//				ArrayList<String> fechas = null;
//				JSONArray jarrFechas = null;
//				if(jo.has("fecha"))	{
//					try {
//						fechas = new ArrayList<String>();
//						jarrFechas = jo.getJSONArray("fecha");
//						if (jarrFechas != null )	{
//							int top = jarrFechas.length();
//							for (int i = 0; i < top; i++) {	
//								JSONObject obj = jarrFechas.getJSONObject(i);
//								fechas.add(obj.getString("fecha"));
//							}
//						} 
//					} catch (JSONException e) {
//						e.printStackTrace();
//					}
//				}
//				
//				
//				ArrayList<String> enlaces = null;
//				JSONArray jarrEnlaces = null;
//				if(jo.has("enlace"))	{
//					try {
//						enlaces = new ArrayList<String>();
//						jarrEnlaces = jo.getJSONArray("enlace");
//						if (jarrEnlaces != null )	{
//							int top = jarrEnlaces.length();
//							for (int i = 0; i < top; i++) {	
//								JSONObject obj = jarrEnlaces.getJSONObject(i);
//								enlaces.add(obj.getString("enlace"));
//							}
//						}
//					} catch (JSONException e) {
//						e.printStackTrace();
//					}
//				}
//				
//				ArrayList<Red> redes = null;
//				JSONArray jarrRedes = null;
//				if(jo.has("redes"))	{
//					try {
//						redes = new ArrayList<Red>();
//						jarrRedes = jo.getJSONArray("redes");
//						if (jarrRedes != null )	{
//							int top = jarrRedes.length();
//							for (int i = 0; i < top; i++) {	
//								JSONObject obj = jarrRedes.getJSONObject(i);
//								Red r = new Red(obj.getString("red"),obj.getString("url"));
//								redes.add(r);
//							}
//						} 
//					}catch (JSONException e) {
//						e.printStackTrace();
//					}
//					
//				}
//				/*
//				ma = new LugarMarker(
//						unescapeHTML(jo.getString("title"), 0), 
//						jo.getDouble("lat"), 
//						jo.getDouble("lng"), 
//						jo.getDouble("elevation"), 
//						enlaces, 
//						getDataSource(id_categoria),
//						jo.getString("id"), 
//						fechas, 
//						jo.getString("description"), 
//						jo.getString("id_poiPadre"), 
//						jo.getString("titlePadre"), 
//						poiIdHijos,
//						titleHijos, 
//						urlImgs,
//						jo.getString("contacto"),
//						jo.getString("ubicacion"),
//						redes);*/
//				ma = new LugarMarker(
//						jo.getString("id"), 
//						unescapeHTML(jo.getString("title"), 0), 
//						jo.getDouble("lat"), 
//						jo.getDouble("lng"), 
//						jo.getDouble("elevation"), 
//						getDataSource(id_categoria),
//						jo.getString("id_punto_padre"),
//						jo.getString("descripcion"),
//						jo.getString("desc_corta"),
//						jo.getString("contacto"),
//						jo.getString("ubicacion"),
//						jo.getInt("piso"),
//						jo.getInt("pisos"),
//						jo.getInt("estrellas"),
//						jo.getInt("encuestas"),
//						jo.getInt("icono"),
//						urlImgs,
//						redes,
//						enlaces,
//						fechas, 
//						poiIdHijos
//					);
//				markers.add(ma);
//			}
//		}
//		return null;		
//		
//	}
	
	private DATASOURCE getDataSource(String filtro) {
		/*
		if (filtro.equals("facultades"))	{
			return DataSource.DATASOURCE.LFACULTADES;
		}
		else if (filtro.equals("departamentos"))	{
			return DataSource.DATASOURCE.LDEPARTAMENTOS;
		}
		else if (filtro.equals("eventos"))	{
			return DataSource.DATASOURCE.EVENTOSURL;
		}
		else if (filtro.equals("lugares"))	{
			return DataSource.DATASOURCE.LUGARESURL;
		}
		else if (filtro.equals("auditorios"))	{
			return DataSource.DATASOURCE.LAUDITORIOS;
		}
		else if (filtro.equals("bibliotecas"))	{
			return DataSource.DATASOURCE.LBIBLIOTECAS;
		}
		else if (filtro.equals("cafeterias"))	{
			return DataSource.DATASOURCE.LCAFETERIAS;
		}
		else if (filtro.equals("institutos"))	{
			return DataSource.DATASOURCE.LCENTROS;
		}
		else if (filtro.equals("centros"))	{
			return DataSource.DATASOURCE.LCENTROS;
		}
		else if (filtro.equals("direcciones"))	{
			return DataSource.DATASOURCE.LDIRECCIONES;
		}
		else if (filtro.equals("otros"))	{
			return DataSource.DATASOURCE.LOTROS;
		}
		*/
		
		//nuevo
		if (filtro.equals("1"))	{
			return DataSource.DATASOURCE.ASESORIA_PASTORAL;
		}
		else if (filtro.equals("2"))	{
			return DataSource.DATASOURCE.ASOCIACIONES_Y_GRUPOS;
		}
		else if (filtro.equals("3"))	{
			return DataSource.DATASOURCE.AUDITORIOS;
		}
		else if (filtro.equals("4"))	{
			return DataSource.DATASOURCE.BANCOS_Y_CAJEROS_AUTOMATICOS;
		}
		else if (filtro.equals("5"))	{
			return DataSource.DATASOURCE.CAFETERIAS;
		}
		else if (filtro.equals("6"))	{
			return DataSource.DATASOURCE.CENTRO_DE_FOTOCOPIADO;
		}
		else if (filtro.equals("7"))	{
			return DataSource.DATASOURCE.CENTROS_DE_ESTUDIOS_Y_CENTROS_DE_INVESTIGACION;
		}
		else if (filtro.equals("8"))	{
			return DataSource.DATASOURCE.COMEDORES_Y_FOOD_COURT;
		}
		else if (filtro.equals("9"))	{
			return DataSource.DATASOURCE.DEPARTAMENTOS_ACADEMICOS;
		}
		else if (filtro.equals("10"))	{
			return DataSource.DATASOURCE.DEPORTES;
		}
		else if (filtro.equals("11"))	{
			return DataSource.DATASOURCE.DIRECCIONES_Y_OFICINAS;
		}
		else if (filtro.equals("12"))	{
			return DataSource.DATASOURCE.EDIFICIOS;
		}
		else if (filtro.equals("13"))	{
			return DataSource.DATASOURCE.EDIFICIOS_MULTIFUNCIONALES;
		}
		else if (filtro.equals("14"))	{
			return DataSource.DATASOURCE.ESTACIONAMIENTOS;
		}
		else if (filtro.equals("15"))	{
			return DataSource.DATASOURCE.FACULTADES;
		}
		else if (filtro.equals("16"))	{
			return DataSource.DATASOURCE.FACULTADES_AUDITORIOS_Y_LABORATORIOS;
		}
		else if (filtro.equals("17"))	{
			return DataSource.DATASOURCE.INSTITUTOS_GENERICO;
		}
		else if (filtro.equals("18"))	{
			return DataSource.DATASOURCE.INSTITUTOS_SUBCATEGORIA;
		}
		else if (filtro.equals("19"))	{
			return DataSource.DATASOURCE.INSTITUTOS_DE_IDIOMAS;
		}
		else if (filtro.equals("20"))	{
			return DataSource.DATASOURCE.LABORATORIOS_Y_TALLERES;
		}
		else if (filtro.equals("21"))	{
			return DataSource.DATASOURCE.LIBRERIAS;
		}
		else if (filtro.equals("22"))	{
			return DataSource.DATASOURCE.MAQUINAS_EXPENDEDORAS;
		}
		else if (filtro.equals("23"))	{
			return DataSource.DATASOURCE.PABELLONES_DE_AULAS;
		}
		else if (filtro.equals("24"))	{
			return DataSource.DATASOURCE.PAGOS_Y_TRANSACCIONES;
		}
		else if (filtro.equals("25"))	{
			return DataSource.DATASOURCE.PAPELERIA_Y_SERVICIOS_DIGITALES;
		}
		else if (filtro.equals("26"))	{
			return DataSource.DATASOURCE.QUIOSCOS;
		}
		else if (filtro.equals("27"))	{
			return DataSource.DATASOURCE.SALAS_DE_LECTURA;
		}
		else if (filtro.equals("28"))	{
			return DataSource.DATASOURCE.SERVICIO_DE_TESORERIA;
		}
		else if (filtro.equals("29"))	{
			return DataSource.DATASOURCE.SERVICIOS_ALIMENTICIOS;
		}
		else if (filtro.equals("30"))	{
			return DataSource.DATASOURCE.SERVICIOS_DE_COMPUTADORAS_E_IMPRESORAS;
		}
		else if (filtro.equals("31"))	{
			return DataSource.DATASOURCE.SERVICIOS_DE_SALUD;
		}
		else if (filtro.equals("32"))	{
			return DataSource.DATASOURCE.SERVICIOS_HIGIENICOS;
		}
		else if (filtro.equals("33"))	{
			return DataSource.DATASOURCE.SISTEMAS_DE_BIBLIOTECAS;
		}
		else if (filtro.equals("34"))	{
			return DataSource.DATASOURCE.SISTEMAS_DE_BIBLIOTECAS_Y_SALAS_DE_LECTURA;
		}
		else if (filtro.equals("35"))	{
			return DataSource.DATASOURCE.TELEFONOS_DE_EMERGENCIA;
		}
		else if (filtro.equals("36"))	{
			return DataSource.DATASOURCE.TELEFONOS_PUBLICOS;
		}
		else if (filtro.equals("37"))	{
			return DataSource.DATASOURCE.TELEFONOS;
		}
		else if (filtro.equals("38"))	{
			return DataSource.DATASOURCE.VARIOS;
		}
		else if (filtro.equals("39"))	{
			return DataSource.DATASOURCE.VARIOS;
		}
		//fin nuevo
		
		return DataSource.DATASOURCE.VARIOS;//nunca debe entrar aqui, si lo hace se producirán errores
	}
	
	private static HashMap<String, String> htmlEntities;
	static {
		htmlEntities = new HashMap<String, String>();
		htmlEntities.put("&lt;", "<");
		htmlEntities.put("&gt;", ">");
		htmlEntities.put("&amp;", "&");
		htmlEntities.put("&quot;", "\"");
		htmlEntities.put("&agrave;", "à");
		htmlEntities.put("&Agrave;", "À");
		htmlEntities.put("&acirc;", "â");
		htmlEntities.put("&auml;", "ä");
		htmlEntities.put("&Auml;", "Ä");
		htmlEntities.put("&Acirc;", "Â");
		htmlEntities.put("&aring;", "å");
		htmlEntities.put("&Aring;", "Å");
		htmlEntities.put("&aelig;", "æ");
		htmlEntities.put("&AElig;", "Æ");
		htmlEntities.put("&ccedil;", "ç");
		htmlEntities.put("&Ccedil;", "Ç");
		htmlEntities.put("&eacute;", "é");
		htmlEntities.put("&Eacute;", "É");
		htmlEntities.put("&egrave;", "è");
		htmlEntities.put("&Egrave;", "È");
		htmlEntities.put("&ecirc;", "ê");
		htmlEntities.put("&Ecirc;", "Ê");
		htmlEntities.put("&euml;", "ë");
		htmlEntities.put("&Euml;", "Ë");
		htmlEntities.put("&iuml;", "ï");
		htmlEntities.put("&Iuml;", "Ï");
		htmlEntities.put("&ocirc;", "ô");
		htmlEntities.put("&Ocirc;", "Ô");
		htmlEntities.put("&ouml;", "ö");
		htmlEntities.put("&Ouml;", "Ö");
		htmlEntities.put("&oslash;", "ø");
		htmlEntities.put("&Oslash;", "Ø");
		htmlEntities.put("&szlig;", "ß");
		htmlEntities.put("&ugrave;", "ù");
		htmlEntities.put("&Ugrave;", "Ù");
		htmlEntities.put("&ucirc;", "û");
		htmlEntities.put("&Ucirc;", "Û");
		htmlEntities.put("&uuml;", "ü");
		htmlEntities.put("&Uuml;", "Ü");
		htmlEntities.put("&nbsp;", " ");
		htmlEntities.put("&copy;", "\u00a9");
		htmlEntities.put("&reg;", "\u00ae");
		htmlEntities.put("&euro;", "\u20a0");
	}

	public String unescapeHTML(String source, int start) {
		int i, j;

		i = source.indexOf("&", start);
		if (i > -1) {
			j = source.indexOf(";", i);
			if (j > i) {
				String entityToLookFor = source.substring(i, j + 1);
				String value = (String) htmlEntities.get(entityToLookFor);
				if (value != null) {
					source = new StringBuffer().append(source.substring(0, i))
					.append(value).append(source.substring(j + 1))
					.toString();
					return unescapeHTML(source, i + 1); // recursive call
				}
			}
		}
		return source;
	}
}